(function() {
	var STK = (function() {
		var that = {};
		var errorList = [];
		that.inc = function(ns, undepended) {
			return true
		};
		that.register = function(ns, maker) {
			var NSList = ns.split(".");
			var step = that;
			var k = null;
			while (k = NSList.shift()) {
				if (NSList.length) {
					if (step[k] === undefined) {
						step[k] = {}
					}
					step = step[k]
				} else {
					if (step[k] === undefined) {
						try {
							step[k] = maker(that)
						} catch (exp) {
						}
					}
				}
			}
		};
		that.regShort = function(sname, sfun) {
			if (that[sname] !== undefined) {
				throw "[" + sname + "] : short : has been register"
			}
			that[sname] = sfun
		};
		that.IE = /msie/i.test(navigator.userAgent);
		that.E = function(id) {
			if (typeof id === "string") {
				return document.getElementById(id)
			} else {
				return id
			}
		};
		that.C = function(tagName) {
			var dom;
			tagName = tagName.toUpperCase();
			if (tagName == "TEXT") {
				dom = document.createTextNode("")
			} else {
				if (tagName == "BUFFER") {
					dom = document.createDocumentFragment()
				} else {
					dom = document.createElement(tagName)
				}
			}
			return dom
		};
		that.log = function(str) {
			errorList.push("[" + ((new Date()).getTime() % 100000) + "]: "
					+ str)
		};
		that.getErrorLogInformationList = function(n) {
			return errorList.splice(0, n || errorList.length)
		};
		return that
	})();
	$Import = STK.inc;
	STK.register("http://tjs.sjs.sinajs.cn/open/api/js/core.str.trim",
			function($) {
				return function(str) {
					if (typeof str !== "string") {
						throw "trim need a string as parameter"
					}
					var len = str.length;
					var s = 0;
					var reg = /(\u3000|\s|\t|\u00A0)/;
					while (s < len) {
						if (!reg.test(str.charAt(s))) {
							break
						}
						s += 1
					}
					while (len > s) {
						if (!reg.test(str.charAt(len - 1))) {
							break
						}
						len -= 1
					}
					return str.slice(s, len)
				}
			});
	STK.register("core.evt.addEvent", function($) {
		return function(sNode, sEventType, oFunc) {
			var oElement = $.E(sNode);
			if (oElement == null) {
				return false
			}
			sEventType = sEventType || "click";
			if ((typeof oFunc).toLowerCase() != "function") {
				return
			}
			if (oElement.attachEvent) {
				oElement.attachEvent("on" + sEventType, oFunc)
			} else {
				if (oElement.addEventListener) {
					oElement.addEventListener(sEventType, oFunc, false)
				} else {
					oElement["on" + sEventType] = oFunc
				}
			}
			return true
		}
	});
	STK.register("core.obj.parseParam", function($) {
		return function(oSource, oParams, isown) {
			var key, obj = {};
			oParams = oParams || {};
			for (key in oSource) {
				obj[key] = oSource[key];
				if (oParams[key] != null) {
					if (isown) {
						if (oSource.hasOwnProperty[key]) {
							obj[key] = oParams[key]
						}
					} else {
						obj[key] = oParams[key]
					}
				}
			}
			return obj
		}
	});
	STK.register("core.arr.isArray", function($) {
		return function(o) {
			return Object.prototype.toString.call(o) === "[object Array]"
		}
	});
	STK.register("core.json.queryToJson", function($) {
		return function(QS, isDecode) {
			var _Qlist = $.core.str.trim(QS).split("&");
			var _json = {};
			var _fData = function(data) {
				if (isDecode) {
					return decodeURIComponent(data)
				} else {
					return data
				}
			};
			for ( var i = 0, len = _Qlist.length; i < len; i++) {
				if (_Qlist[i]) {
					var _hsh = _Qlist[i].split("=");
					var _key = _hsh[0];
					var _value = _hsh[1];
					if (_hsh.length < 2) {
						_value = _key;
						_key = "$nullName"
					}
					if (!_json[_key]) {
						_json[_key] = _fData(_value)
					} else {
						if ($.core.arr.isArray(_json[_key]) != true) {
							_json[_key] = [ _json[_key] ]
						}
						_json[_key].push(_fData(_value))
					}
				}
			}
			return _json
		}
	});
	STK.register("core.obj.isEmpty", function($) {
		return function(o, isprototype) {
			var ret = true;
			for ( var k in o) {
				if (isprototype) {
					ret = false;
					break
				} else {
					if (o.hasOwnProperty(k)) {
						ret = false;
						break
					}
				}
			}
			return ret
		}
	});
	STK.register("core.util.cookie", function($) {
		var that = {
			set : function(sKey, sValue, oOpts) {
				var arr = [];
				var d, t;
				var cfg = $.core.obj.parseParam({
					expire : null,
					path : "/",
					domain : null,
					secure : null,
					encode : true
				}, oOpts);
				if (cfg.encode == true) {
					sValue = escape(sValue)
				}
				arr.push(sKey + "=" + sValue);
				if (cfg.path != null) {
					arr.push("path=" + cfg.path)
				}
				if (cfg.domain != null) {
					arr.push("domain=" + cfg.domain)
				}
				if (cfg.secure != null) {
					arr.push(cfg.secure)
				}
				if (cfg.expire != null) {
					d = new Date();
					t = d.getTime() + cfg.expire * 3600000;
					d.setTime(t);
					arr.push("expires=" + d.toGMTString())
				}
				document.cookie = arr.join(";")
			},
			get : function(sKey) {
				sKey = sKey.replace(/([\.\[\]\$])/g, "\\$1");
				var rep = new RegExp(sKey + "=([^;]*)?;", "i");
				var co = document.cookie + ";";
				var res = co.match(rep);
				if (res) {
					return res[1] || ""
				} else {
					return ""
				}
			},
			remove : function(sKey, oOpts) {
				oOpts = oOpts || {};
				oOpts.expire = -10;
				that.set(sKey, "", oOpts)
			}
		};
		return that
	});
	STK
			.register(
					"core.str.parseURL",
					function($) {
						return function(url) {
							var parse_url = /^(?:([A-Za-z]+):(\/{0,3}))?([0-9.\-A-Za-z]+\.[0-9A-Za-z]+)?(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
							var names = [ "url", "scheme", "slash", "host",
									"port", "path", "query", "hash" ];
							var results = parse_url.exec(url);
							var that = {};
							for ( var i = 0, len = names.length; i < len; i += 1) {
								that[names[i]] = results[i] || ""
							}
							return that
						}
					});
	STK.register("core.json.jsonToQuery", function($) {
		var _fdata = function(data, isEncode) {
			data = data == null ? "" : data;
			data = $.core.str.trim(data.toString());
			if (isEncode) {
				return encodeURIComponent(data)
			} else {
				return data
			}
		};
		return function(JSON, isEncode) {
			var _Qstring = [];
			if (typeof JSON == "object") {
				for ( var k in JSON) {
					if (k === "$nullName") {
						_Qstring = _Qstring.concat(JSON[k]);
						continue
					}
					if (JSON[k] instanceof Array) {
						for ( var i = 0, len = JSON[k].length; i < len; i++) {
							_Qstring.push(k + "="
									+ _fdata(JSON[k][i], isEncode))
						}
					} else {
						if (typeof JSON[k] != "function") {
							_Qstring.push(k + "=" + _fdata(JSON[k], isEncode))
						}
					}
				}
			}
			if (_Qstring.length) {
				return _Qstring.join("&")
			} else {
				return ""
			}
		}
	});
	STK.register("http://tjs.sjs.sinajs.cn/open/api/js/core.util.URL",
			function($) {
				return function(sURL, args) {
					var opts = $.core.obj.parseParam({
						isEncodeQuery : false,
						isEncodeHash : false
					}, args || {});
					var that = {};
					var url_json = $.core.str.parseURL(sURL);
					var query_json = $.core.json.queryToJson(url_json.query);
					var hash_json = $.core.json.queryToJson(url_json.hash);
					that.setParam = function(sKey, sValue) {
						query_json[sKey] = sValue;
						return this
					};
					that.getParam = function(sKey) {
						return query_json[sKey]
					};
					that.setParams = function(oJson) {
						for ( var key in oJson) {
							that.setParam(key, oJson[key])
						}
						return this
					};
					that.setHash = function(sKey, sValue) {
						hash_json[sKey] = sValue;
						return this
					};
					that.getHash = function(sKey) {
						return hash_json[sKey]
					};
					that.valueOf = that.toString = function() {
						var url = [];
						var query = $.core.json.jsonToQuery(query_json,
								opts.isEncodeQuery);
						var hash = $.core.json.jsonToQuery(hash_json,
								opts.isEncodeQuery);
						if (url_json.scheme != "") {
							url.push(url_json.scheme + ":");
							url.push(url_json.slash)
						}
						if (url_json.host != "") {
							url.push(url_json.host);
							if (url_json.port != "") {
								url.push(":");
								url.push(url_json.port)
							}
						}
						url.push("/");
						url.push(url_json.path);
						if (query != "") {
							url.push("?" + query)
						}
						if (hash != "") {
							url.push("#" + hash)
						}
						return url.join("")
					};
					return that
				}
			});
	STK
			.register(
					"core.util.browser",
					function($) {
						var ua = navigator.userAgent.toLowerCase();
						var external = window.external || "";
						var core, m, extra, version, os;
						var numberify = function(s) {
							var c = 0;
							return parseFloat(s.replace(/\./g, function() {
								return (c++ == 1) ? "" : "."
							}))
						};
						try {
							if ((/windows|win32/i).test(ua)) {
								os = "windows"
							} else {
								if ((/macintosh/i).test(ua)) {
									os = "macintosh"
								} else {
									if ((/rhino/i).test(ua)) {
										os = "rhino"
									}
								}
							}
							if ((m = ua.match(/applewebkit\/([^\s]*)/)) && m[1]) {
								core = "webkit";
								version = numberify(m[1])
							} else {
								if ((m = ua.match(/presto\/([\d.]*)/)) && m[1]) {
									core = "presto";
									version = numberify(m[1])
								} else {
									if (m = ua.match(/msie\s([^;]*)/)) {
										core = "trident";
										version = 1;
										if ((m = ua.match(/trident\/([\d.]*)/))
												&& m[1]) {
											version = numberify(m[1])
										}
									} else {
										if (/gecko/.test(ua)) {
											core = "gecko";
											version = 1;
											if ((m = ua.match(/rv:([\d.]*)/))
													&& m[1]) {
												version = numberify(m[1])
											}
										}
									}
								}
							}
							if (/world/.test(ua)) {
								extra = "world"
							} else {
								if (/360se/.test(ua)) {
									extra = "360"
								} else {
									if ((/maxthon/.test(ua))
											|| typeof external.max_version == "number") {
										extra = "maxthon"
									} else {
										if (/tencenttraveler\s([\d.]*)/
												.test(ua)) {
											extra = "tt"
										} else {
											if (/se\s([\d.]*)/.test(ua)) {
												extra = "sogou"
											}
										}
									}
								}
							}
						} catch (e) {
						}
						var IE11 = ua.indexOf("trident/7.0") != -1
								&& (ua.indexOf("rv 11.0") != -1 || ua
										.indexOf("rv:11.0") != -1);
						var ret = {
							OS : os,
							CORE : core,
							Version : version,
							EXTRA : (extra ? extra : false),
							IE : /msie/.test(ua) || IE11,
							OPERA : /opera/.test(ua),
							MOZ : /gecko/.test(ua)
									&& !/(compatible|webkit)/.test(ua),
							IE5 : /msie 5 /.test(ua),
							IE55 : /msie 5.5/.test(ua),
							IE6 : /msie 6/.test(ua),
							IE7 : /msie 7/.test(ua),
							IE8 : /msie 8/.test(ua),
							IE9 : /msie 9/.test(ua),
							IE11 : IE11,
							SAFARI : !/chrome\/([\d.]*)/.test(ua)
									&& /\/([\d.]*) safari/.test(ua),
							CHROME : /chrome\/([\d.]*)/.test(ua),
							IPAD : /\(ipad/i.test(ua),
							IPHONE : /\(iphone/i.test(ua),
							ITOUCH : /\(itouch/i.test(ua),
							MOBILE : /mobile/i.test(ua)
						};
						return ret
					});
	STK.register("core.dom.isNode", function($) {
		return function(node) {
			return (node != undefined) && Boolean(node.nodeName)
					&& Boolean(node.nodeType)
		}
	});
	STK
			.register(
					"core.util.hideContainer",
					function($) {
						var hideDiv;
						var initDiv = function() {
							if (hideDiv) {
								return
							}
							hideDiv = $.C("div");
							hideDiv.style.cssText = "position:absolute;top:-9999px;left:-9999px;";
							document.getElementsByTagName("head")[0]
									.appendChild(hideDiv)
						};
						var that = {
							appendChild : function(el) {
								if ($.core.dom.isNode(el)) {
									initDiv();
									hideDiv.appendChild(el)
								}
							},
							removeChild : function(el) {
								if ($.core.dom.isNode(el)) {
									hideDiv && hideDiv.removeChild(el)
								}
							}
						};
						return that
					});
	window.WB2 = window.WB2 || {};
	WB2._config = WB2._config || {};
	WB2._config.host = "http://js.t.sinajs.cn/";
	WB2._config.cssHost = "http://img.t.sinajs.cn/";
	WB2._config.cdn_version = "http://tjs.sjs.sinajs.cn/open/api/js/20150130.02";
	window.WB2 = window.WB2 || {};
	WB2.Module = {
		loginButton : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/loginButton{ver}.js?version=20140327",
					css : "http://tjs.sjs.sinajs.cn/t3/style/css/common/card.css?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/loginButton.js?version=20140327",
					css : "loginButton.css"/* tpa=http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/loginButton/loginButton.css */
				}
			}
		},
		followButton : {
			versions : {
				"1.0" : {
					js : "followButton{ver}.js"/* tpa=http://tjs.sjs.sinajs.cn/open/api/js/followButton{ver}.js */,
					css : "http://tjs.sjs.sinajs.cn/t3/style/css/common/card.css?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/followButton.js?version=20140327",
					css : "followButtonSdk.css"/* tpa=http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/followButton/followButtonSdk.css */
				}
			}
		},
		publish : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/publish{ver}.js?version=20150206",
					css : "http://tjs.sjs.sinajs.cn/t3/style/css/thirdpart/rlsbox.css?version=20140327"
				},
				"1.1" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/publish{ver}.js?version=20150206",
					css : "js_weibo_send.css"/* tpa=http://tjs.sjs.sinajs.cn/t35/appstyle/opent/css/widgets/js_weibo_send/js_weibo_send.css */
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/publish.js?version=20150206",
					css : "weiboPublish.css"/* tpa=http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/weiboPublish/weiboPublish.css */
				}
			}
		},
		hoverCard : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/hoverCard{ver}.js?version=20141124",
					css : "http://tjs.sjs.sinajs.cn/t3/style/css/common/card.css?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/hoverCard.js?version=20141124",
					css : "weiboCard.css"/* tpa=http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/weiboCard/weiboCard.css */
				}
			}
		},
		recommend : {
			versions : {
				"1.0" : {
					js : "recommend{ver}.js"/* tpa=http://tjs.sjs.sinajs.cn/open/api/js/recommend{ver}.js */
				},
				latest : {
					js : "recommend.js"/* tpa=http://tjs.sjs.sinajs.cn/open/api/js/recommend.js */,
					css : "interested.css"/* tpa=http://tjs.sjs.sinajs.cn/t3/style/css/thirdpart/interested.css */
				}
			}
		},
		selector : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/selector{ver}.js?version=20140327",
					css : "csuser.css"/* tpa=http://tjs.sjs.sinajs.cn/t3/style/css/thirdpart/csuser.css */
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/selector.js?version=20140327",
					css : "http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/selector/selector.css?version=20150714"
				}
			}
		},
		shareRecommend : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/shareRecommend{ver}.js?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/shareRecommend.js?version=20140327",
					css : "weiboFamous.css"/* tpa=http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/weiboFamous/weiboFamous.css */
				}
			}
		},
		like : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/like{ver}.js?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/like.js?version=20140327",
					css : "http://tjs.sjs.sinajs.cn/t4/appstyle/widget/css/praiseButton/praiseButton.css?version=20140327"
				}
			}
		},
		iframeWidget : {
			versions : {
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/iframeWidget.js?version=20140327"
				}
			}
		},
		invite : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/invite{ver}.js?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/invite.js?version=20140327",
					css : "layer_frame.css"/* tpa=http://img.t.sinajs.cn/t4/appstyle/V5_invite/css/module/frame/layer_frame.css */
				}
			}
		},
		quote : {
			versions : {
				"1.0" : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/quote{ver}.js?version=20140327"
				},
				latest : {
					js : "http://tjs.sjs.sinajs.cn/open/api/js/quote.js?version=20140327"
				}
			}
		}
	};
	STK.register("core.func.getType", function($) {
		return function(oObject) {
			var _t;
			return ((_t = typeof (oObject)) == "object" ? oObject == null
					&& "null"
					|| Object.prototype.toString.call(oObject).slice(8, -1)
					: _t).toLowerCase()
		}
	});
	STK.register("core.dom.ready", function($) {
		var funcList = [];
		var inited = false;
		var getType = $.core.func.getType;
		var browser = $.core.util.browser;
		var addEvent = $.core.evt.addEvent;
		var checkReady = function() {
			if (!inited) {
				if (document.readyState === "complete") {
					return true
				}
			}
			return inited
		};
		var execFuncList = function() {
			if (inited == true) {
				return
			}
			inited = true;
			for ( var i = 0, len = funcList.length; i < len; i++) {
				if (getType(funcList[i]) === "function") {
					try {
						funcList[i].call()
					} catch (exp) {
					}
				}
			}
			funcList = []
		};
		var scrollMethod = function() {
			if (checkReady()) {
				execFuncList();
				return
			}
			try {
				document.documentElement.doScroll("left")
			} catch (e) {
				setTimeout(arguments.callee, 25);
				return
			}
			execFuncList()
		};
		var readyStateMethod = function() {
			if (checkReady()) {
				execFuncList();
				return
			}
			setTimeout(arguments.callee, 25)
		};
		var domloadMethod = function() {
			addEvent(document, "DOMContentLoaded", execFuncList)
		};
		var windowloadMethod = function() {
			addEvent(window, "load", execFuncList)
		};
		if (!checkReady()) {
			if ($.IE && window === window.top) {
				scrollMethod()
			}
			domloadMethod();
			readyStateMethod();
			windowloadMethod()
		}
		return function(oFunc) {
			if (checkReady()) {
				if (getType(oFunc) === "function") {
					oFunc.call()
				}
			} else {
				funcList.push(oFunc)
			}
		}
	});
	STK
			.register(
					"http://tjs.sjs.sinajs.cn/open/api/js/conf.api.wbml",
					function($) {
						window.WB2 = window.WB2 || {};
						var loadJs = function(sURL, oCallBack) {
							var js;
							js = parent.document.createElement("script");
							js.charset = "UTF-8";
							var IE = /msie/i.test(navigator.userAgent);
							if (IE) {
								js.onreadystatechange = function() {
									if (js.readyState.toLowerCase() == "complete"
											|| js.readyState.toLowerCase() == "loaded") {
										oCallBack();
										js.onreadystatechange = null
									}
								}
							} else {
								js.onload = function() {
									oCallBack();
									js.onload = null
								}
							}
							js.src = sURL;
							parent.document.getElementsByTagName("head")[0]
									.appendChild(js);
							return js
						};
						var WidgetLoad = {
							widgetCache : {},
							loadCss : function(url) {
								css = document.createElement("link");
								css.href = url;
								css.type = "text/css";
								css.rel = "stylesheet";
								document.getElementsByTagName("head")[0]
										.appendChild(css);
								WidgetLoad.widgetCache[url] = 1
							},
							getWidgetFile : function(module, version) {
								var baseUrl = window.WB2._config.host
										+ "/open/api";
								var cssHost = window.WB2._config.cssHost;
								var widgetModule = WB2.Module;
								var Module = widgetModule[module];
								if (!Module) {
									throw ("Module " + module + " can not be found!")
								}
								Module = widgetModule[module]["versions"][version];
								if (!Module) {
									Module = widgetModule[module]["versions"]["latest"]
								}
								var _js = Module.js.replace("{ver}", version);
								var _css = (Module.css != null ? Module.css
										: widgetModule[module]["versions"]["latest"]["css"])
										|| "";
								var js = baseUrl + "/js/widget/" + module + "/"
										+ _js;
								var css = _css != "" ? (/^http:\/\//.test(_css) ? _css
										: cssHost + _css)
										: "";
								return {
									js : js,
									css : css
								}
							},
							loadWidget : function(opts, callback) {
								var name = opts.module, version = opts.version, loadcss = opts.loadcss;
								var wFiles = this.getWidgetFile(name, version);
								var myCallBack = function() {
									callback && callback(wFiles);
									queue.next()
								};
								WidgetLoad._init(wFiles.js, myCallBack);
								if (!loadcss) {
									return
								}
								if (wFiles.css && !this.widgetCache[wFiles.css]) {
									this.loadCss(wFiles.css)
								}
							},
							_init : function(url, callback) {
								if (WidgetLoad.widgetCache[url]) {
									callback && callback()
								} else {
									loadJs(url, function() {
										WidgetLoad.widgetCache[url] = 1;
										callback && callback()
									})
								}
							}
						};
						var widgetObject = (function() {
							var that = {
								load : function(oArgs, oPara) {
									var _moduleName = oArgs.module || "", _version, loadCss = true;
									if (_moduleName == "") {
										throw "no availiable module found."
									}
									if (typeof oPara === "string") {
										_version = oPara || "latest"
									} else {
										if (typeof oPara === "object") {
											_version = oPara.version
													|| "latest";
											loadCss = oPara.loadcss
										}
									}
									var args = {
										module : _moduleName,
										version : _version,
										loadcss : loadCss
									};
									if (_moduleName == "connectButton") {
										_moduleName = "loginButton"
									}
									WidgetLoad.loadWidget(args, function(file) {
										try {
											WB2.widget[_moduleName].call(
													window, oArgs.params)
										} catch (e) {
											STK.common.log.monitor({
												from : "jssdk",
												url : file.js,
												param : oArgs.params,
												title : _moduleName,
												error : e.toString()
											});
											throw e.toString()
										}
									});
									return this
								}
							};
							var widgetModule = WB2.Module;
							for ( var key in widgetModule) {
								if (key && widgetModule[key]) {
									if (key == "loginButton") {
										that.connectButton = (function(k) {
											return function(args, opts) {
												that.load({
													module : k,
													params : args
												}, opts)
											}
										})(key)
									}
									that[key] = (function(k) {
										return function(args, opts) {
											that.load({
												module : k,
												params : args
											}, opts)
										}
									})(key)
								}
							}
							return that
						})();
						return function() {
							var browser = $.core.util.browser;
							var tagInfo = [ {
								tagName : "login-button",
								widgetName : "loginButton"
							}, {
								tagName : "publish",
								widgetName : "publish"
							}, {
								tagName : "share-recommend",
								widgetName : "shareRecommend"
							}, {
								tagName : "like",
								widgetName : "like"
							}, {
								tagName : "follow-button",
								widgetName : "iframeWidget"
							}, {
								tagName : "share-button",
								widgetName : "iframeWidget"
							}, {
								tagName : "list",
								widgetName : "iframeWidget"
							}, {
								tagName : "show",
								widgetName : "iframeWidget"
							}, {
								tagName : "topic",
								widgetName : "iframeWidget"
							}, {
								tagName : "comments",
								widgetName : "iframeWidget"
							}, {
								tagName : "livestream",
								widgetName : "iframeWidget"
							}, {
								tagName : "bulkfollow",
								widgetName : "iframeWidget"
							}, {
								tagName : "hotlist",
								widgetName : "iframeWidget"
							}, {
								tagName : "invite",
								widgetName : "invite"
							}, {
								tagName : "quote",
								widgetName : "quote"
							} ];
							var getDomElementsNs = function(localName, xmlns) {
								xmlns = xmlns || "wb";
								var ua = navigator.userAgent.toLowerCase();
								var fullName = xmlns + ":" + localName;
								if (browser.IE) {
									try {
										var docNamespaces = document.namespaces;
										if (docNamespaces
												&& docNamespaces[xmlns]) {
											return document
													.getElementsByTagName(localName).length == 0 ? document
													.getElementsByTagName(fullName)
													: document
															.getElementsByTagName(localName)
										}
									} catch (e) {
									}
									return document
											.getElementsByTagName(fullName)
								} else {
									if (browser.MOZ) {
										return document.getElementsByTagNameNS(
												document.body.namespaceURI,
												fullName)
									} else {
										return document
												.getElementsByTagName(fullName)
									}
								}
							};
							var getDomAttribute = function(oCustomDom, tagName) {
								var attrArr = oCustomDom.attributes;
								var oAttr = {};
								for ( var i = attrArr.length - 1; i >= 0; i--) {
									var oAttrib = attrArr[i];
									if (oAttrib.specified) {
										oAttr[attrArr[i].name] = attrArr[i].value
									}
								}
								oAttr.dom = oCustomDom;
								oAttr.tagName = tagName;
								return oAttr
							};
							var initCustomTag = function() {
								var widgetList = [];
								for ( var i = 0, len = tagInfo.length; i < len; i++) {
									var oTag = tagInfo[i];
									var tagName = oTag.tagName;
									var widget = oTag.widgetName;
									var cDomList = getDomElementsNs(tagName);
									for ( var j = 0, wlen = cDomList.length; j < wlen; j++) {
										cDomList[j].innerHTML = '<span style="background:url(http://timg.sjs.sinajs.cn/t4/appstyle/widget/images/library/base/loading1.gif) no-repeat;height:18px;padding:0 0 2px 20px;">Loading...</span>';
										widgetList.push({
											tag : tagName,
											widget : widget,
											params : getDomAttribute(
													cDomList[j], tagName)
										})
									}
								}
								var len = widgetList.length;
								if (len > 0) {
									if (/weibo|ucbrowser/i
											.test(navigator.userAgent)) {
										for ( var i = 0, len = widgetList.length; i < len; i++) {
											var oWidget = widgetList[i];
											(function(ow) {
												setTimeout(function() {
													widgetObject[ow.widget]
															(ow.params)
												}, i * 50)
											})(oWidget)
										}
									} else {
										WB2
												.anyWhere(function(W) {
													for ( var i = 0, len = widgetList.length; i < len; i++) {
														var oWidget = widgetList[i];
														(function(ow) {
															setTimeout(
																	function() {
																		W.widget[ow.widget]
																				(ow.params)
																	}, i * 50)
														})(oWidget)
													}
												})
									}
								}
							};
							(function() {
								try {
									if (document.namespaces
											&& !document.namespaces.item.wb) {
										document.namespaces.add("wb")
									}
								} catch (e) {
								}
							}());
							WB2.initCustomTag = initCustomTag;
							$.core.dom.ready(function() {
								initCustomTag()
							})
						}
					});
	STK
			.register(
					"core.json.jsonToStr",
					function($) {
						function f(n) {
							return n < 10 ? "0" + n : n
						}
						if (typeof Date.prototype.toJSON !== "function") {
							Date.prototype.toJSON = function(key) {
								return isFinite(this.valueOf()) ? this
										.getUTCFullYear()
										+ "-"
										+ f(this.getUTCMonth() + 1)
										+ "-"
										+ f(this.getUTCDate())
										+ "T"
										+ f(this.getUTCHours())
										+ ":"
										+ f(this.getUTCMinutes())
										+ ":"
										+ f(this.getUTCSeconds()) + "Z" : null
							};
							String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function(
									key) {
								return this.valueOf()
							}
						}
						var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = {
							"\b" : "\\b",
							"\t" : "\\t",
							"\n" : "\\n",
							"\f" : "\\f",
							"\r" : "\\r",
							'"' : '\\"',
							"\\" : "\\\\"
						}, rep;
						function quote(string) {
							escapable.lastIndex = 0;
							return escapable.test(string) ? '"'
									+ string.replace(escapable, function(a) {
										var c = meta[a];
										return typeof c === "string" ? c
												: "\\u"
														+ ("0000" + a
																.charCodeAt(0)
																.toString(16))
																.slice(-4)
									}) + '"' : '"' + string + '"'
						}
						function str(key, holder) {
							var i, k, v, length, mind = gap, partial, value = holder[key];
							if (value && typeof value === "object"
									&& typeof value.toJSON === "function") {
								value = value.toJSON(key)
							}
							if (typeof rep === "function") {
								value = rep.call(holder, key, value)
							}
							switch (typeof value) {
							case "string":
								return quote(value);
							case "number":
								return isFinite(value) ? String(value) : "null";
							case "boolean":
							case "null":
								return String(value);
							case "object":
								if (!value) {
									return "null"
								}
								gap += indent;
								partial = [];
								if (Object.prototype.toString.apply(value) === "[object Array]") {
									length = value.length;
									for (i = 0; i < length; i += 1) {
										partial[i] = str(i, value) || "null"
									}
									v = partial.length === 0 ? "[]"
											: gap ? "[\n" + gap
													+ partial.join(",\n" + gap)
													+ "\n" + mind + "]" : "["
													+ partial.join(",") + "]";
									gap = mind;
									return v
								}
								if (rep && typeof rep === "object") {
									length = rep.length;
									for (i = 0; i < length; i += 1) {
										k = rep[i];
										if (typeof k === "string") {
											v = str(k, value);
											if (v) {
												partial.push(quote(k)
														+ (gap ? ": " : ":")
														+ v)
											}
										}
									}
								} else {
									for (k in value) {
										if (Object.hasOwnProperty
												.call(value, k)) {
											v = str(k, value);
											if (v) {
												partial.push(quote(k)
														+ (gap ? ": " : ":")
														+ v)
											}
										}
									}
								}
								v = partial.length === 0 ? "{}" : gap ? "{\n"
										+ gap + partial.join(",\n" + gap)
										+ "\n" + mind + "}" : "{"
										+ partial.join(",") + "}";
								gap = mind;
								return v
							}
						}
						return function(value, replacer, space) {
							var i;
							gap = "";
							indent = "";
							if (typeof space === "number") {
								for (i = 0; i < space; i += 1) {
									indent += " "
								}
							} else {
								if (typeof space === "string") {
									indent = space
								}
							}
							rep = replacer;
							if (replacer
									&& typeof replacer !== "function"
									&& (typeof replacer !== "object" || typeof replacer.length !== "number")) {
								throw new Error("JSON.stringify")
							}
							return str("", {
								"" : value
							})
						}
					});
	STK
			.register(
					"http://tjs.sjs.sinajs.cn/open/api/js/common.util.date",
					function() {
						var format = function(date, fmt) {
							var o = {
								"M+" : date.getMonth() + 1,
								"d+" : date.getDate(),
								"h+" : date.getHours() % 12 == 0 ? 12 : date
										.getHours() % 12,
								"H+" : date.getHours(),
								"m+" : date.getMinutes(),
								"s+" : date.getSeconds(),
								"q+" : Math.floor((date.getMonth() + 3) / 3),
								S : date.getMilliseconds()
							};
							var week = {
								"0" : "/u65e5",
								"1" : "/u4e00",
								"2" : "/u4e8c",
								"3" : "/u4e09",
								"4" : "/u56db",
								"5" : "/u4e94",
								"6" : "/u516d"
							};
							if (/(y+)/.test(fmt)) {
								fmt = fmt.replace(RegExp.$1, (date
										.getFullYear() + "")
										.substr(4 - RegExp.$1.length))
							}
							if (/(E+)/.test(fmt)) {
								fmt = fmt
										.replace(
												RegExp.$1,
												((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "/u661f/u671f"
														: "/u5468")
														: "")
														+ week[date.getDay()
																+ ""])
							}
							for ( var k in o) {
								if (new RegExp("(" + k + ")").test(fmt)) {
									fmt = fmt
											.replace(
													RegExp.$1,
													(RegExp.$1.length == 1) ? (o[k])
															: (("00" + o[k])
																	.substr(("" + o[k]).length)))
								}
							}
							return fmt
						};
						return function(date, pattern) {
							date = date || new Date();
							pattern = pattern || "yyyy-MM-dd hh:mm:ss";
							return format(date, pattern)
						}
					});
	STK
			.register(
					"http://tjs.sjs.sinajs.cn/open/api/js/conf.api.log",
					function($) {
						var isConsoleEnable = typeof window.console == "object"
								&& (typeof window.console.log == "function" || typeof window.console.log == "object");
						var panelId = "weibo_jssdk_console_panel";
						var minHeight = 30, maxHeight = 90;
						var Icon = {
							info : "#0088CC",
							warn : "#D2D128",
							error : "#F50A0A"
						};
						var cPanel = {
							init : function() {
								var pos = "position:fixed;";
								if ($.core.util.browser.IE6) {
									pos = "position:absolute;"
								}
								var title = $.C("h5");
								title.innerHTML = 'Sina Weibo JSSDK Console Panel<a href="http://jssdk.sinaapp.com/help.php" target="_blank" style="position:absolute;right:0;margin-right:5px;color:#0088CC;font-size:12px;font-weight:normal;">Help?</a>';
								title.style.cssText = "margin: 8px;font-size:13px;border-bottom:1px solid #ccc;";
								var logDiv = $.C("div");
								logDiv.id = panelId + "_logdiv";
								logDiv.style.cssText = "background:#000; color:#FFF; margin:5px; border:1px solid #ccc; height:150px; max-height:150px; overflow-x:hidden; overflow-y: auto; word-break:nowrap; padding:5px 5px;border-radius:5px;";
								var textArea = $.C("textarea");
								textArea.value = 'WB2.console.log("test");';
								textArea.style.cssText = "line-height:20px;font-size:12px;width:380px;height:30px;overflow-y:auto;margin:3px;padding:5px; border-radius:5px;border:1px solid #ccc;";
								textArea.onfocus = function() {
									textArea.select()
								};
								textArea.ondblclick = function() {
									if (parseInt(textArea.style.height) < maxHeight) {
										textArea.style.height = maxHeight
												+ "px"
									} else {
										textArea.style.height = minHeight
												+ "px"
									}
								};
								var clear = $.C("input");
								clear.type = "button";
								clear.value = "Clear";
								clear.style.cssText = "width:60px;height: 30px;border:1px solid #ccc; padding:2px 15px;border-radius:5px 0 0 5px;";
								clear.onclick = function() {
									logDiv.innerHTML = ""
								};
								var run = $.C("input");
								run.type = "button";
								run.value = "Run";
								run.style.cssText = "width:60px;height: 30px;border:1px solid #ccc; border-right:0;border-left:0; padding:2px 15px;";
								run.onclick = function() {
									var val = textArea.value;
									if (val) {
										eval(val)
									}
								};
								var close = $.C("input");
								close.type = "button";
								close.value = "Close";
								close.style.cssText = "width:60px;height: 30px;border:1px solid #ccc; padding:2px 15px;border-radius:0 5px 5px 0;";
								close.onclick = function() {
									cPanel.hide()
								};
								var bar = $.C("p");
								bar.appendChild(clear);
								bar.appendChild(run);
								bar.appendChild(close);
								bar.style.cssText = "margin:5px 3px;";
								var panel = document.createElement("div");
								panel.id = panelId;
								panel.style.cssText = pos
										+ "z-index:9999;left:0;top:0;width:400px;background:#eee;padding:5px;border-radius:5px;border:1px solid #bbb;";
								panel.appendChild(title);
								panel.appendChild(logDiv);
								panel.appendChild(textArea);
								panel.appendChild(bar);
								cPanel.output = logDiv;
								cPanel.close = close;
								cPanel.panel = panel;
								document.body.appendChild(panel)
							},
							show : function() {
								if (!$.E(panelId)) {
									cPanel.init()
								}
								cPanel.output = cPanel.output
										|| $.E(panelId + "_logdiv");
								cPanel.panel
										&& (cPanel.panel.style.display = "block")
							},
							hide : function() {
								cPanel.panel
										&& (cPanel.panel.style.display = "none")
							},
							setLog : function(obj, level) {
								if (typeof obj == "string") {
									var date = new Date(), now = $.common.util
											.date(new Date()), styles = "";
									switch (level) {
									case "info":
										styles = Icon.info;
										break;
									case "warn":
										styles = Icon.warn;
										break;
									case "error":
										styles = Icon.error;
										break
									}
									styles = "color:" + styles;
									var html = '<p style="line-height:18px;margin:0;padding:0;"><span style="font-size:12px;color:#2EBC2C;">'
											+ now
											+ '</span><span style="font-size:12px;font-family: Verdana;padding-left:5px;'
											+ styles + '">' + obj;
									if (cPanel.output.innerHTML != "") {
										html = html + "\r\n"
												+ cPanel.output.innerHTML
									}
									cPanel.output.innerHTML = html
											+ "</span></p>";
									cPanel.output.scrollTop = 0
								}
							},
							log : function(info, level) {
								cPanel.show();
								var output = "";
								if (typeof info == "object"
										|| Object.prototype.toString.call(info) === "[object Array]") {
									if (typeof info.parent === "object") {
										output = info.toString()
									} else {
										output = $.core.json.jsonToStr(info,
												null, "\t")
									}
								} else {
									if (typeof info == "undefined") {
										output = "undefined"
									} else {
										output = info.toString()
									}
								}
								cPanel.setLog(output, level)
							}
						};
						var debugLevel = [ "log", "info", "warn", "error",
								"dir" ];
						return function() {
							window.WB2 = window.WB2 || {};
							window.WB2.console = window.WB2.console || {};
							window.WB2.console.init = function() {
								WB2._config.debug = true;
								isConsoleEnable = false
							};
							function init() {
								for ( var i = 0, len = debugLevel.length; i < len; i++) {
									var lv = debugLevel[i];
									WB2.console[lv] = (function(level) {
										return function(info) {
											if (WB2._config.debug) {
												if (isConsoleEnable) {
													window.console[level](info)
												} else {
													try {
														cPanel.log(info, level)
													} catch (e) {
														cPanel.log(e.message,
																level)
													}
												}
											}
										}
									})(lv)
								}
							}
							init();
							var logList = {
								"USE_X-UA-Compatible" : function() {
									if (!$.core.util.browser.IE11) {
										return
									}
									var isCompatible = false, cMeta;
									var metas = document
											.getElementsByTagName("meta");
									if (metas && metas.length > 0) {
										for ( var i = 0, len = metas.length; i < len; i++) {
											if (metas[i]
													.getAttribute("http-equiv") == "X-UA-Compatible") {
												cMeta = metas[i];
												if (metas[i].getAttribute(
														"content").indexOf(
														"IE7") != -1) {
													isCompatible = true
												}
												break
											}
										}
									}
									var ret = {
										output : true,
										reason : "Use X-UA-Compatible Model In Current Page. "
									};
									return ret
								}
							};
							$.core.dom.ready(function() {
								for ( var k in logList) {
									var result = logList[k]();
									if (result && result.output) {
										WB2.console.warn(result.reason)
									}
								}
							})
						}
					});
	var USER_STATUS;
	var APPKEY_AVAILABLE = true;
	var LOGIN_FUNC_LIST = [];
	var API_VERSION = 2;
	var OAUTH_QUERY_URL = "https://api.weibo.com/" + API_VERSION
			+ "/oauth2/query";
	var OAUTH_LOGIN_WINDOW;
	var OAUTH_LOGIN_URL = "https://api.weibo.com/" + API_VERSION
			+ "/oauth2/authorize";
	var JS_CACHE = {};
	var $ = STK;
	var parseParam = $.core.obj.parseParam, addEvent = $.core.evt.addEvent, trim = $.core.str.trim, browser = $.core.util.browser, CookieUtil = $.core.util.cookie, queryToJson = $.core.json.queryToJson;
	var jsonp = function(oOpts) {
		var opts = {
			url : "",
			charset : "UTF-8",
			timeout : 30 * 1000,
			args : {},
			onComplete : null,
			onTimeout : null,
			responseName : null,
			varkey : "callback"
		};
		var funcStatus = -1;
		opts = parseParam(opts, oOpts);
		var uniqueID = opts.responseName
				|| ("STK_" + Math.floor(Math.random() * 1000) + new Date()
						.getTime().toString());
		opts.args[opts.varkey] = uniqueID;
		var completeFunc = opts.onComplete;
		var timeoutFunc = opts.onTimeout;
		window[uniqueID] = function(oResult) {
			if (funcStatus != 2 && completeFunc != null) {
				funcStatus = 1;
				completeFunc(oResult)
			}
		};
		opts.onComplete = null;
		opts.onTimeout = function() {
			if (funcStatus != 1 && timeoutFunc != null) {
				funcStatus = 2;
				timeoutFunc()
			}
		};
		return loadJs(opts)
	};
	var loadJs = function(oOpts) {
		var js, requestTimeout;
		var opts = {
			url : "",
			charset : "UTF-8",
			timeout : 30 * 1000,
			args : {},
			onComplete : null,
			onTimeout : null,
			uniqueID : null
		};
		opts = parseParam(opts, oOpts);
		if (opts.url == "") {
			throw "url is null"
		}
		js = document.createElement("script");
		js.charset = "UTF-8";
		var IE = /msie/i.test(navigator.userAgent);
		if (opts.onComplete != null) {
			if (IE) {
				js.onreadystatechange = function() {
					if (js.readyState.toLowerCase() == "complete"
							|| js.readyState.toLowerCase() == "loaded") {
						clearTimeout(requestTimeout);
						opts.onComplete();
						js.onreadystatechange = null
					}
				}
			} else {
				js.onload = function() {
					clearTimeout(requestTimeout);
					opts.onComplete();
					js.onload = null
				}
			}
		}
		var jsonToQuery = function(oArgs) {
			if (oArgs) {
				var _query = [];
				for ( var p in oArgs) {
					_query.push(p + "=" + encodeURIComponent(trim(oArgs[p])))
				}
				if (_query.length) {
					return _query.join("&")
				} else {
					return ""
				}
			}
		};
		var query = jsonToQuery(opts.args);
		if (opts.url.indexOf("?") == -1) {
			if (query != "") {
				query = "?" + query
			}
		} else {
			if (query != "") {
				query = "&" + query
			}
		}
		js.src = opts.url + query;
		document.getElementsByTagName("head")[0].appendChild(js);
		if (opts.timeout > 0 && opts.onTimeout != null) {
			requestTimeout = setTimeout(function() {
				opts.onTimeout()
			}, opts.timeout)
		}
		return js
	};
	var Queue = function() {
		this.started = 1;
		this.taskList = [];
		this.setStatue = function(statue) {
			this.started = statue
		};
		this.start = function() {
			this.setStatue(0);
			var i, method, args, pointer;
			var fun = this.taskList.shift();
			var method = fun[0], args = fun[1], pointer = fun[2];
			method.apply(pointer, args)
		};
		this.next = function() {
			this.setStatue(1);
			if (this.taskList.length > 0) {
				this.start()
			}
		};
		this.add = function(oFunc, oOpts) {
			var opts = {
				args : [],
				pointer : window,
				top : false
			};
			opts = parseParam(opts, oOpts);
			if (opts.top) {
				this.taskList.unshift([ oFunc, opts.args, opts.pointer ])
			} else {
				this.taskList.push([ oFunc, opts.args, opts.pointer ])
			}
			if (this.started) {
				this.start()
			}
		}
	};
	var queue = new Queue();
	function initCommunicate(options) {
		var ver = WB2._config.version, instances = WB2.anyWhere._instances, blankIframe = instances[ver];
		if (blankIframe) {
			if (blankIframe.contentWindow._ready) {
				blankIframe.contentWindow.request(options)
			} else {
				WB2.addToCallbacks(blankIframe.contentWindow, options)
			}
		} else {
			WB2.delayCall(options)
		}
	}
	function anyWhere(callback) {
		var oRequest = {
			requestType : "anywhere",
			callback : callback
		};
		regIframeRequest(oRequest)
	}
	function regIframeRequest(options) {
		var oRequest = options || {};
		var myCallBack = function() {
			initCommunicate(oRequest);
			queue.next()
		};
		var init = function(oCallback) {
			if (JS_CACHE.bundle) {
				oCallback && oCallback()
			} else {
				loadJs({
					url : WB2._config.host
							+ "/open/api/js/api/bundle.js?version="
							+ WB2._config.cdn_version,
					onComplete : function() {
						JS_CACHE.bundle = 1;
						oCallback && oCallback()
					}
				})
			}
		};
		queue.add(init, {
			args : [ myCallBack ]
		})
	}
	function clientInfo() {
		var scripts = document.getElementsByTagName("script");
		var len = scripts.length, index = 0, weiboJs, url, appkey, secret, version;
		if (len > 0) {
			weiboJs = scripts[index++];
			while (weiboJs) {
				if (weiboJs.src
						.indexOf("wb-1.js"/*tpa=http://tjs.sjs.sinajs.cn/open/api/js/api/js/wb.js*/) != -1) {
					url = weiboJs.src.split("?").pop();
					break
				}
				weiboJs = scripts[index++]
			}
		}
		url = url.toLowerCase();
		var oPara = queryToJson(url);
		appkey = oPara.appkey || "";
		secret = oPara.secret || "";
		debug = oPara.debug || false;
		version = oPara.version || 1;
		return {
			appkey : appkey,
			secret : secret,
			debug : debug,
			version : version
		}
	}
	function loginReady(oFunc, bStart) {
		var i, len;
		if (oFunc != null) {
			if (bStart == true) {
				LOGIN_FUNC_LIST.unshift(oFunc)
			} else {
				LOGIN_FUNC_LIST.push(oFunc)
			}
		}
		if (WB2.checkLogin()) {
			for (i = 0, len = LOGIN_FUNC_LIST.length; i < len; i++) {
				LOGIN_FUNC_LIST[i].call()
			}
			LOGIN_FUNC_LIST = []
		}
	}
	function showLogin(oArgs) {
		var url = $.core.util.URL(OAUTH_LOGIN_URL), iWidth = 600, iHeight = 455;
		url.setParam("client_id", oArgs.appkey);
		url.setParam("response_type", "token");
		url.setParam("display", "js");
		url.setParam("transport", "html5");
		url.setParam("referer", encodeURI(document.location.href));
		OAUTH_LOGIN_WINDOW = window.open(url, "oauth_login_window", "width="
				+ iWidth + ",height=" + iHeight
				+ ",toolbar=no,menubar=no,resizable=no,status=no,left="
				+ (screen.width - iWidth) / 2 + ",top="
				+ (screen.height - iHeight) / 2);
		if (OAUTH_LOGIN_WINDOW) {
			OAUTH_LOGIN_WINDOW.focus()
		}
		return
	}
	function messageHandler(event) {
		if ((/\api.weibo\.com$/).test(event.origin)) {
			var data = event.data;
			data = unescape(data);
			data = queryToJson(data);
			if (data.error_code) {
				data.success = -1;
				data.status = -1
			} else {
				data.success = 1;
				data.status = 1
			}
			loginCallBack(data)
		}
	}
	function loginCallBack(data) {
		WB2.console.log(data);
		loginStatus(data.status);
		if (data.success == 1) {
			Cookie.save(data);
			loginReady()
		} else {
			LOGIN_FUNC_LIST.pop()
		}
	}
	function login(oCallBack) {
		if (!APPKEY_AVAILABLE) {
			return
		}
		loginReady(oCallBack, true);
		if (!WB2.checkLogin()) {
			if (window.postMessage && !browser.IE) {
				showLogin({
					appkey : WB2._config.appkey
				})
			} else {
				regIframeRequest({
					appkey : WB2._config.appkey,
					requestType : "login",
					callback : loginCallBack
				})
			}
		}
	}
	function logout(oCallBack) {
		if (!WB2.checkLogin()) {
			return
		}
		if (WB2._config.appkey != null) {
			Cookie.del();
			loginStatus(-1);
			WB2._config.access_token = null;
			delete WB2._config.access_token;
			try {
				jsonp({
					url : "https://api.weibo.com/2/account/end_session.json?source="
							+ WB2._config.appkey,
					onComplete : function(o) {
						oCallBack && oCallBack(o.data)
					}
				})
			} catch (e) {
				throw "JavaScript SDK: logout error"
			}
		}
	}
	function loginStatus(status) {
		if (status == null) {
			return
		}
		USER_STATUS = status
	}
	function checkLogin() {
		return USER_STATUS == 1
	}
	var Cookie = {
		load : function() {
			if (!$.core.obj.isEmpty(WB2.oauthData)) {
				return WB2.oauthData
			} else {
				var _cookie = CookieUtil.get("weibojs_" + WB2._config.appkey);
				_cookie = unescape(_cookie);
				var oCookie = queryToJson(_cookie);
				return oCookie
			}
		},
		save : function(oCookie) {
			WB2.oauthData = oCookie;
			var _cookie = "access_token=" + (oCookie.access_token || "")
					+ "&refresh_token=" + (oCookie.refresh_token || "")
					+ "&expires_in=" + (oCookie.expires_in || 0) + "&uid="
					+ (oCookie.uid || "") + "&status="
					+ (oCookie.status || USER_STATUS || -1);
			CookieUtil.set("weibojs_" + WB2._config.appkey, _cookie, {
				path : "/",
				domain : document.domain
			})
		},
		del : function() {
			WB2.oauthData = {};
			CookieUtil.remove("weibojs_" + WB2._config.appkey, {
				path : "/",
				domain : document.domain
			})
		}
	};
	function getLoginStatus(options) {
		var oCookie = options || Cookie.load();
		var access_token = oCookie.access_token || "";
		var expires_in = oCookie.expires_in || "";
		if (access_token != "") {
			USER_STATUS = 1
		}
		jsonp({
			url : OAUTH_QUERY_URL,
			onComplete : function(oData) {
				WB2.console.log(oData);
				oData = oData || {};
				if (oData.status == 1 && oData.access_token) {
					Cookie.save(oData);
					WB2._config.access_token = oData.access_token;
					WB2._config.uid = oData.uid
				}
				if (oData.error) {
					APPKEY_AVAILABLE = false;
					WB2.console.warn(oData.error);
					if (oData.error == "xd2.jsp has not Referer!") {
						WB2.console.warn("您使用的appkey未和域名进行绑定，请绑定后使用。")
					}
					return
				}
				USER_STATUS = oData.status;
				loginReady()
			},
			args : {
				source : WB2._config.appkey
			}
		})
	}
	var init = function(opts) {
		if (opts.access_token) {
			USER_STATUS = 1;
			APPKEY_AVAILABLE = true;
			var oData = {
				status : USER_STATUS,
				access_token : opts.access_token
			};
			if (opts.uid) {
				oData.uid = opts.uid
			}
			Cookie.save(oData)
		}
	};
	window.WB2 = window.WB2 || {};
	WB2.widget = {};
	var sdkClient = clientInfo();
	WB2._config = WB2._config || {};
	WB2._config.version = sdkClient.version;
	WB2._config.appkey = sdkClient.appkey;
	WB2._config.secret = sdkClient.secret;
	WB2._config.debug = sdkClient.debug;
	WB2.oauthData = {};
	WB2.init = init;
	WB2.login = login;
	WB2.logout = logout;
	WB2.checkLogin = checkLogin;
	WB2.anyWhere = anyWhere;
	WB2.anyWhere._instances = {};
	WB2.Cookie = Cookie;
	WB2.regIframeRequest = regIframeRequest;
	$.conf.api.log();
	$.conf.api.wbml();
	WB2._config.appkey && getLoginStatus();
	if (window.postMessage && !browser.IE) {
		$.core.evt.addEvent(window, "message", messageHandler)
	}
})();